# TODO: Analyzing OSV Json

from typing import Dict, List, Optional, Union
from datetime import datetime
from loguru import logger

class OsvParser:
    """
    OSV (Open Source Vulnerability) 数据解析器
    用于解析和标准化 OSV 格式的漏洞数据
    """

    def __init__(self, osv_json: Dict):
        """
        初始化 OSV 解析器
        :param osv_json: OSV 格式的 JSON 数据
        """
        self.osv = osv_json
        self.parsed_data = None

    def parse(self) -> Dict:
        """
        解析 OSV 数据并返回标准化的格式
        :return: 解析后的标准化数据
        """
        try:
            self.parsed_data = {
                'id': self._get_id(),
                'aliases': self._get_aliases(),
                'summary': self._get_summary(),
                'description': self._get_description(),
                'severity': self._get_severity(),
                'affected_packages': self._get_affected_packages(),
                'references': self._get_references(),
                'cwes': self._get_cwes(),
                'published': self._get_published(),
                'modified': self._get_modified(),
                'withdrawn': self._get_withdrawn(),
                'tags': self._get_tags(),
                'source': self._get_source()
            }
            return self.parsed_data
        except Exception as e:
            logger.error(f"解析 OSV 数据时发生错误: {str(e)}")
            raise

    def _get_id(self) -> str:
        """获取漏洞 ID"""
        return self.osv.get('id', '')

    def _get_aliases(self) -> List[str]:
        """获取漏洞别名（如 CVE ID）"""
        return self.osv.get('aliases', [])

    def _get_summary(self) -> str:
        """获取漏洞摘要"""
        return self.osv.get('summary', '')

    def _get_description(self) -> str:
        """获取漏洞详细描述"""
        return self.osv.get('details', '')

    def _get_severity(self) -> List[Dict]:
        """获取漏洞严重程度"""
        return self.osv.get('severity', [])

    def _get_affected_packages(self) -> List[Dict]:
        """获取受影响的包信息"""
        return self.osv.get('affected', [])

    def _get_references(self) -> List[Dict]:
        """获取相关引用"""
        return self.osv.get('references', [])

    def _get_cwes(self) -> List[str]:
        """获取 CWE ID 列表"""
        return self.osv.get('cwes', [])

    def _get_published(self) -> Optional[str]:
        """获取发布时间"""
        return self.osv.get('published')

    def _get_modified(self) -> Optional[str]:
        """获取最后修改时间"""
        return self.osv.get('modified')

    def _get_withdrawn(self) -> Optional[str]:
        """获取撤回时间"""
        return self.osv.get('withdrawn')

    def _get_tags(self) -> List[str]:
        """获取标签列表"""
        return self.osv.get('tags', [])

    def _get_source(self) -> str:
        """获取数据来源"""
        return self.osv.get('source', 'unknown')

    @classmethod
    def parse_batch(cls, osv_json_list: List[Dict]) -> List[Dict]:
        """
        批量解析多个 OSV 数据
        :param osv_json_list: OSV JSON 数据列表
        :return: 解析后的标准化数据列表
        """
        results = []
        for osv_json in osv_json_list:
            try:
                parser = cls(osv_json)
                parsed_data = parser.parse()
                results.append(parsed_data)
            except Exception as e:
                logger.error(f"解析 OSV 数据时发生错误: {str(e)}")
                continue
        return results
